package wodegua.d32_期末考试真题.demo1_stream相关;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * 第一题(15):stream流相关
 *
 * 需求
 * 。某小型商城系统的订单信息在素材下的orders.xml文件中，现在要求把xml中的订单信息，封装成一个一个的订单对象，将订单对象保存到ArrayList集合中。
 *
 * **具体功能点要求**
 * 1)定义订单类Order，创建ArrayList集合，用于存储订单Order对象(解析XML 4分，封装成对象2分)
 * 2)请使用Stream流找出今天之前的订单，并遍历输出。(3分)
 * 3)请使用Stream流找出集合中价格最贵的订流单，把这个订单的详细信息打印出来。(3分)
 * 4)请使用Stream流遍历集合中的每个订单，要求按照价格降序输出每个订单的详情。(3分)
 */
public class Test {
    public static void main(String[] args) throws Exception {
        List<Order> orders = new ArrayList<>();

        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(Test.class.getResource("")+"/orders.xml");
        Element root = document.getRootElement();
        List<Element> elements = root.elements();

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        for (Element element : elements) {
            Order order = new Order(
                    Integer.parseInt(element.attributeValue("id"))
                    , element.elementText("name")
                    , LocalDateTime.parse(element.elementText("time"), formatter)
                    , Double.parseDouble(element.elementText("price"))
            );
            orders.add(order);
        }
        System.out.println("所有的订单：");
        orders.forEach(System.out::println);
        //2)请使用Stream流找出今天之前的订单，并遍历输出。(3分)
        System.out.println("今天之前的订单：");
        LocalDateTime todayTime = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
        orders.stream().filter(d -> d.getTime().isBefore(todayTime)).forEach(System.out::println);
        System.out.println("------------------------------------");
        //3)请使用Stream流找出集合中价格最贵的订单，把这个订单的详细信息打印出来。(3分)
        System.out.println("最贵的订单：");
        double maxPrice = orders.stream().max(Comparator.comparingDouble(Order::getPrice)).get().getPrice();
        orders.stream().filter(d -> d.getPrice() == maxPrice).forEach(System.out::println);
        System.out.println("------------------------------------");
        //请使用Stream流遍历集合中的每个订单，要求按照价格降序输出每个订单的详情。(3分)
        System.out.println("价格降序订单：");
        orders.stream().sorted((o1, o2) -> Double.compare(o2.getPrice(),o1.getPrice())).forEach(System.out::println);
        System.out.println("------------------------------------");

    }
}
